home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PCTV3N5 / FPTRIG.CPP < prev    next >
Text File  |  1992-09-29  |  3KB  |  74 lines

  1. /*==================================================================
  2.  fptrig.cpp -- Fixed point math class trig functions [Listing #3]
  3.  by Robert N. Goldrich
  4.  Tested with Borland, Microsoft, Zortech, and TopSpeed C++
  5. ==================================================================*/
  6. #include "fpnum.h"
  7.  
  8. #if( FP_FRCBITS != 16)
  9.     #error Fixed-point trig table good only for 16 fractional bits
  10. #endif
  11.  
  12. static unsigned sin_table[] = {   //  "static" enforces info hiding
  13.         0U,     1143U,     2287U,     3429U,     4571U, //  0 deg.
  14.      5711U,     6850U,     7986U,     9120U,    10252U,
  15.     11380U,    12504U,    13625U,    14742U,    15854U, // 10
  16.     16961U,    18064U,    19160U,    20251U,    21336U,
  17.     22414U,    23486U,    24550U,    25606U,    26655U, // 20
  18.     27696U,    28729U,    29752U,    30767U,    31772U,
  19.     32768U,    33753U,    34728U,    35693U,    36647U, // 30
  20.     37589U,    38521U,    39440U,    40347U,    41243U,
  21.     42125U,    42995U,    43852U,    44695U,    45525U, // 40
  22.     46340U,    47142U,    47929U,    48702U,    49460U,
  23.     50203U,    50931U,    51643U,    52339U,    53019U, // 50
  24.     53683U,    54331U,    54963U,    55577U,    56175U,
  25.     56755U,    57319U,    57864U,    58393U,    58903U, // 60
  26.     59395U,    59870U,    60326U,    60763U,    61183U,
  27.     61583U,    61965U,    62328U,    62672U,    62997U, // 70
  28.     63302U,    63589U,    63856U,    64103U,    64331U,
  29.     64540U,    64729U,    64898U,    65047U,    65176U, // 80
  30.     65286U,    65376U,    65446U,    65496U,    65526U
  31. } ;                                                // Thru 89 deg
  32.  
  33.  
  34. /*------------------------------------------------------------------
  35.  fp_sin()
  36. ------------------------------------------------------------------*/
  37. fpnum fp_sin( int angle )
  38. {
  39.     angle %= 360 ;            // force angle between 0-360 degrees
  40.     if( angle < 0 ) {
  41.         angle += 360 ;
  42.     }
  43.  
  44.     fpnum sinvalue ;                // this is the return value
  45.  
  46.     if( angle == 90 ) {             // not handled by table
  47.         return sinvalue.poke( FP_ONE ) ;
  48.     }
  49.  
  50.     if( angle == 270 ) {            // not handled by table
  51.         return sinvalue.poke( -FP_ONE ) ;
  52.     }
  53.  
  54.     switch( angle/90 ) {    // switch based on quadrant
  55.         case 0:                         // 0 - 90 deg
  56.             return sinvalue.poke( sin_table[angle] ) ;
  57.         case 1:                         // 90 - 180 deg
  58.             return sinvalue.poke( sin_table[180-angle] ) ; ;
  59.         case 2:                         // 180 - 270 deg
  60.             return sinvalue.poke( -((long)sin_table[angle-180]) ) ;
  61.         case 3:                         // 270 - 360 deg
  62.             return sinvalue.poke( -((long)sin_table[360-angle]) ) ;
  63.     }
  64. }
  65.  
  66.  
  67. /*------------------------------------------------------------------
  68.  fp_tan()
  69. ------------------------------------------------------------------*/
  70. fpnum fp_tan( int angle )
  71. {
  72.     return fp_sin( angle ) / fp_cos( angle ) ;
  73. }
  74.